list p=16F870
include "p16f870.inc"
;*********** definicion de parametros**********
PCL     equ 0x02
ESTADO  equ 0x03
PUERTOA equ 0x05
PUERTOB equ 0x06
PUERTOC equ 0x07
PCLATH  equ 0x0A
RDELAY  equ 0x21
CONTA0  equ 0x22
CONTA1  equ 0x23
CONTA2  equ 0x24
letra   equ 0x25
flinea  equ 0x26


;***********  constantes para el LCD******
linea1LCD   equ 0x80
linea2LCD   equ 0xC0
clrLCD      equ 0x01
casaLCD     equ 0x02
incLCD      equ 0x07
decLCD      equ 0x05
onLCD       equ 0x0C
ofLCD       equ 0x08
oncursor    equ 0x0E
offcursor   equ 0x0C
blinkcursor equ 0x0F
izqLCD      equ 0x18
derLCD      equ 0x1C
izqcursor   equ 0x10
dercursor   equ 0x14
funcionLCD  equ 0x38
RS          equ 0
E           equ 2
W           equ 0
F           equ 1
; ************define contantes para tiempo de 20 msg
N equ 0x1A
M equ 0x0
cont1 equ 0x20
cont2 equ 0x21

;******** declaraciones para salvar STATUS Y W******

W_temp      equ 0x70
STATUS_temp equ 0x71

;******** definiciones *******
#define banco0       bcf STATUS,RP0  ; pasa al banco 0
#define banco1       bsf STATUS,RP0 ; pasar al banco 1
#define act_int_gen  bsf INTCON,GIE ; habilitar interrupcion global
#define act_RB0      bsf INTCON,INTE ; habilitar interrupcion por RB0

org 0x00
goto iniciar
org 5 
;org 0x04        ; vector de interrupciones 
;goto interrupcion

; *****************PROGRAMA PRINCIPAL**********************
;                  ******************
iniciar     call   port_LCD
            call   ini_LCD 
rb1         movlw  linea1LCD     ; poner senal para empezar a mandar datos
            call   comandoLCD
            movlw  0x0f          ;w=15 para 15 datos
            movwf  flinea        ; registro flinea=15
            clrf   letra         ; registro que va a moverse sobre la tabla
rb2         movf   letra,W       ; muestra el mensaje
            call   mensaje  
            call   caracterLCD    ; manda el caracter al LCD                              
            call   delay         ; lo muestra por un tiempo
            incf   letra,F        ; f=1 en el registro si f=0 en w
            decfsz flinea,F
            goto rb2
            goto segundal
             

            
; ********** MENSAJE***********

mensaje     addwf     PCL,1
            retlw     A'R'   
            retlw     A'A'   
            retlw     A'N'  
            retlw     A'G'  
            retlw     A'O'  
            retlw     A' '  
            retlw     A'A'  
            retlw     A' '
            retlw     A'C'  
            retlw     A'O'  
            retlw     A'N'  
            retlw     A'T'  
            retlw     A'A'  
            retlw     A'R'  
            retlw     A'?'  

mensaje2    addwf     PCL,1
            retlw     A':'
            retlw     A'O'
            retlw     A'N'
            retlw     A'T'
            retlw     A'E'
            retlw     A'O'
            retlw     A' '
            retlw     A'D'
            retlw     A'E'
            retlw     A'S'
            retlw     A'E'
            retlw     A'A'
            retlw     A'D'
            retlw     A'O'
            

segundal    movlw linea2LCD
            call  comandoLCD
            movlw 0x0F
            movwf flinea
            clrf  letra
rt2         movf letra,W
            call  mensaje2
            call caracterLCD
            call delay
            incf letra,F
            decfsz flinea,F
            goto rt2   
            
            

 


;             ************SUBRUTINAS**************
;                ******************************      
port_LCD    banco1
            movwf 0x06             ;configurar puertoa como E/S digital
            movwf ADCON1
            clrf  PUERTOA          ;configurar puertoa como salida 
            ;clrf  PUERTOB          ;configurar puertoB como salida
            clrf  PUERTOC          ;configurar  puertoc como salida 
            banco0
            bcf  PUERTOA,E        ;manda un 1 a pata E del LCD
            return 


ini_LCD     call   retardo          ;inicializa LCD
            movlw  funcionLCD       ;w 0x38
            call   comandoLCD   
            call   retardo
            ;movlw  funcionLCD       ;w 0x38
            ;call   comandoLCD   
            ;call   retardo
            ;movlw  funcionLCD       ;w 0x38
            ;call   comandoLCD   
            ;call   retardo
            ;movlw  funcionLCD       ;w 0x38
            ;call   comandoLCD   
            movlw  onLCD
            call   comandoLCD
            movlw  clrLCD
            call   comandoLCD
            movlw  decLCD
            call   comandoLCD
            movlw  casaLCD
            call   comandoLCD
            return

comandoLCD     bcf   PUERTOA,RS  ;manda un comando al LCD
               bcf   PUERTOA,E   ;entrada de habilitacion
               movwf PUERTOC
               call  habilitaLCD
               return

caracterLCD    bsf   PUERTOA,RS  ;manda un caracter al LCD
               bcf   PUERTOA,E   
               movwf PUERTOC
               call  habilitaLCD
               return



habilitaLCD    bsf    PUERTOA,E     ;manda caracter o dato al LCD
               movlw  0xFF
               movwf  RDELAY
t1             decfsz RDELAY,F 
               goto t1
               bcf PUERTOA,E
               return

retardo        movlw   0x01   ;retardo
               movwf   CONTA0
ret2           movlw   0x64
               movwf   CONTA1
ret1           movlw   0x64
               movwf   CONTA2
ret0           decfsz  CONTA2,F 
               goto    ret0
               decfsz CONTA1,F
               goto   ret1 
               decfsz CONTA0,F
               goto    ret2
               return 




delay          movlw  0xB0           ; retardo 
               movwf  CONTA0
re2            movlw  0xB0
               movwf  CONTA1
re1            movlw  0x01
               movwf  CONTA2
re0            decfsz CONTA2,F
               goto   re0
               decfsz CONTA1,F
               goto   re1
               decfsz CONTA0,F
               goto   re2
               return


;**************** SUBRUTINAs TECLADO MATRICIAL*********************
;                *************************

inicio_matricial        banco0                      ; pasa al banco 0
                        clrf PUERTOB                ; inicializando el puertoB
                        banco1                      ; pasa al banco 1
                        movlw 0x0E                  ;configura de rb7 a rb4 como entradas 
                        movwf TRISB                 ; y desde rb3 a rb1 como salidas
                        bcf OPTION_REG,7
                        banco0
                        return

deteccion_tecla         bcf   PUERTOB,1
                        btfss  PUERTOB,7
                        goto   rebote
                        btfss  PUERTOB,6
                        goto   rebote 
                        btfss  PUERTOB,5
                        goto   rebote 
                        btfss  PUERTOB,4
                        goto   rebote 
                        retlw  0x0
                        return

rebote                  call   d20ms         ; rutina para demorar 20 ms 
                        btfss  PUERTOB,7
                        retlw  0xFF
                        btfss  PUERTOB,6  
                        retlw  0xFF
                        btfss  PUERTOB,5  
                        retlw  0xFF
                        btfss  PUERTOB,4  
                        retlw  0xFF
                        retlw  0x0
                        


codificacion            movlw 0xF7
                        movwf PUERTOB
                        btfss PUERTOB,7
                        retlw '1'                        
                        btfss PUERTOB,6
                        retlw '4'
                        btfss PUERTOB,5
                        retlw '7'
                        btfss PUERTOB,4
                        retlw '*'
                        movlw 0xFB
                        movwf PUERTOB
                        btfss PUERTOB,7
                        retlw '2'
                        btfss PUERTOB,6
                        retlw '5'
                        btfss PUERTOB,5
                        retlw '8'
                        btfss PUERTOB,4
                        retlw '0' 
                        movlw 0xFD 
                        movwf PUERTOB                                                                                      
                        btfss PUERTOB,7
                        retlw '3'
                        btfss PUERTOB,6
                        retlw '6'
                        btfss PUERTOB,5
                        retlw '9'
                        btfss PUERTOB,4
                        retlw '#'
                        retlw 0x00
                        return 

;            ***rutina tiempo 20 msg*********

d20ms   movlw  N        ; carga dato en N
        movwf  cont1    ;inicializa contador ciclo externo
rep1    movlw  M        ;carga dato en M
        movwf  cont2    ;inicializa contador ciclo externo
rep2    decfsz cont2,1  ;decrementa el contador y escapa si es 0
        goto rep2       ; si no es 0 repite el ciclo interno
        decfsz cont1,1  ;decrementa el contador y escapa si es 0
        goto rep1       ; si no es 0 repite el ciclo interno
        return
   
end

